home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC]
/
NeXTSTEP 3.3 Dev Intel.iso
/
NextDeveloper
/
Source
/
GNU
/
cctools
/
as
/
i860-check.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-09-09
|
4KB
|
138 lines
#include "i860-opcode.h"
#include <stdio.h>
extern long random();
char *controlregs[] = { "fir", "psr", "epsr", "dirbase", "db", "fsr" };
#define NCREGS (sizeof controlregs / sizeof controlregs[0])
char *textlabels[] = { "foo", "bar", "baz", "xork" };
#define NTLABELS (sizeof textlabels / sizeof textlabels[0])
char *datalabels[] = { "data1", "data2", "data3", "data4" };
#define NDLABELS (sizeof datalabels / sizeof datalabels[0])
/*
* Traverse the opcode table, dumping out sample instructions.
*/
void
main(
int argc,
char *argv[],
char *envp[])
{
int i;
const char *arg;
int r1, r2, rd;
printf( "\t.text\n%s:", textlabels[0] );
for ( i = 0; i < NUMOPCODES; ++i )
{
if ( i == (NUMOPCODES/3) )
printf( "%s:", textlabels[1] );
if ( i == (NUMOPCODES/2) )
printf( "%s:", textlabels[2] );
if ( (random() & 0x30) == 0 &&
(i860_opcodes[i].match & OP_PREFIX_MASK) == PREFIX_FPU )
{
printf( "\td.%s\t", i860_opcodes[i].name );
}
else
printf( "\t%s\t", i860_opcodes[i].name );
r1 = random() & 0x1F;
do
r2 = random() & 0x1F;
while( (r2 & 0x1E) == (r1 & 0x1E) );
do
rd = random() & 0x1F;
while( (rd & 0x1E) == (r1 & 0x1E) || (rd & 0x1E) == (r2 & 0x1E) );
for ( arg = i860_opcodes[i].args; *arg != '\0'; ++arg )
{
switch( *arg )
{
case '1': /* rs1 register, bits 11-15 of insn. */
case '2': /* rs2 register, bits 21-25 of insn. */
case 'd': /* rd register, bits 16-20 of insn. */
printf( "r%d", random() % 32);
break;
case 'e': /* frs1 floating point register, bits 11-15 of insn*/
printf( "f%d", r1 );
break;
case 'f': /* frs2 floating point register, bits 21-25 of insn*/
printf( "f%d", r2 );
break;
case 'g': /* frsd floating point register, bits 16-20 of insn*/
printf( "f%d", rd );
break;
case 'E': /* frs1 floating point register, bits 11-15 of insn*/
printf( "f%d", r1 & 0x1E );
break;
case 'F': /* frs2 floating point register, bits 21-25 of insn*/
printf( "f%d", r2 & 0x1E );
break;
case 'G': /* frsd floating point register, bits 16-20 of insn*/
printf( "f%d", rd & 0x1E );
break;
case 'H': /* frsd floating point register, bits 16-20 of insn*/
printf( "f%d", rd & 0x1C );
break;
case 'I': /* 16 bit High portion of address, I860_RELOC_HIGH. */
printf( "h%%%s", datalabels[random() % NDLABELS] );
break;
case 'i': /* 16 bit byte address low half, */
case 'j': /* 16 bit short address, I860_RELOC_LOW1 */
case 'k': /* 16 bit word/int address low half, I860_RELOC_LOW2 */
case 'l': /* 16 bit 8-byte address (double) low half */
case 'm': /* 16 bit 16-byte address (quad) low half */
case 'n': /* 16 bit byte aligned low half, split fields */
case 'o': /* 16 bit short aligned low half, split fields */
case 'p': /* 16 bit int/word aligned low half, split fields */
printf( "l%%%s", datalabels[random() % NDLABELS] );
break;
case 'J': /* 16 bit High portion of addr requiring adjustment*/
printf( "ha%%%s", datalabels[random() % NDLABELS] );
break;
case 'K': /* 26 bit branch displacement */
case 'L': /* 16 bit split branch displacement */
printf( textlabels[random() % NTLABELS] );
break;
case 'D': /* constant for shift opcode */
case 'B': /* 5 bit immediate, for bte and btne insn */
printf( "%d", random() % 32 );
break;
case 'C': /* Control Register */
printf( controlregs[random() % NCREGS] );
break;
default:
putchar( *arg );
break;
}
}
putchar( '\n' );
}
printf( "%s:\n", textlabels[3] );
printf( "nop\n" );
printf( "\t.text\n" );
printf( "data1: nop\n" );
printf( "data2: nop\n" );
printf( "data3: nop\n" );
printf( "data4: nop\n" );
}